#pragma once

#include "ui_UIVisitor.h"

namespace xs
{

//! Zdarzenie kontrolki.

enum UIEvent
{
	UIE_BUTTON_PRESSED,
	UIE_SLIDER_CHANGED,
	UIE_CHECKBOX_TOGGLED
};

//! Stan kontrolki.

enum UIState
{
	UIS_NONE,
	UIS_PRESSED,
	UIS_FOCUSED
};

class UIVisitor;

//! Klasa bazowa dla wszystkich kontrolek.

class Window
{
public:
	//! Ustawia wszystko na 0 i zmienna show na true.
							Window();
	//! Ustawia wszystkim kontrolkom-dzieciom wartosc parent na 0. @b UWAGA: nie kasuje kontrolek-dzieci.
	virtual					~Window();

	//! Pozycja w przestrzeni kontrolki-rodzica.
	float					x;
	//! Pozycja w przestrzeni kontrolki-rodzica.
	float					y;
	//! Szerokosc kontrolki.
	float					width;
	//! Wysokosc kontrolki.
	float					height;
	//! Stan kontrolki (nic, najechana, wcisnieta).
	u32						state;
	//! Do pelnej dyspozycji uzytkownika.
	u32						style;
	//! Do pelnej dyspozycji uzytkownika.
	u32						id;
	//! Czy kontrolka jest widoczna?
	bool					show;

	//! Dodaj kontrolke-dziecko
	void					add_window(Window *wnd);
	//! Usun kontrolke-dziecko. @b UWAGA: O(n)
	void					remove_window(Window *wnd);
	//! Zwraca kontrolke-potomka z pozycji x,y.
	Window*					get_window_at(float x, float y);
	//! Przemieszcza kontrolke na pierwszy plan.
	void					bring_to_top();
	//! Zwraca pozycje w przestrzeni okna.
	void					get_real_pos(float &_x, float &_y);

protected:
	std::vector<Window*>	m_childs;
	Window*					m_parent;

	virtual void			on_key_down(u32 keycode) {}
	virtual void			on_key_up(u32 keycode) {}
	virtual void			on_type(wchar_t unicode) {}

	virtual void			on_mouse_move(float _x, float _y, float relx, float rely, bool left_pressed) {}
	virtual void			on_lmb_down(float _x, float _y) {}
	virtual void			on_lmb_up(float _x, float _y) {}

	virtual void			accept(UIVisitor *visitor);

private:
	void					clear_state();

	friend class UISystem;
};

}